<?php
/**
 * 日志组件
 * @author seraph.liujb 2009.07.09
 */

class Common_Logger
{
	/**
	 * 日志记录的模块名称，用于区分不同的功能模块，一般被做为日志文件名或日志表名
	 * @var string
	 */
	protected $_module = 'System';

	/**
	 * 日志存储类型：stream txt文本；db 数据库表
	 * @var string
	 */
	protected $_type = 'stream';

	/**
	 * 日志记录文件路径，一般不作修改，适用于stream类型
	 * @var sring
	 */
	protected $_dir = '/log/';

	/**
	 * 日志数据库名称
	 * @var string
	 */
	protected $_database = '';
	
	/**
	 * 日志数据表名称
	 * @var string
	 */
	protected $_table = 'logSystem';

	/**
	 * 日志记录策略：0-7，默认7 调试类型信息
	 * EMERG = 0; 紧急:
	 * ALERT = 1; 提示:
	 * CRIT  = 2; 危险: critical conditions
	 * ERR   = 3; 错误
	 * WARN  = 4; 警告
	 * NOTICE= 5; 通知消息: normal but significant condition
	 * INFO  = 6; 消息
	 * DEBUG = 7; 调试
	 * @var int
	 */
	protected $_priority = 7;

	/**
	 * 构造函数
	 *
	 */
	public function __construct()
	{
		//配置默认stream目录
		$this->_dir = ROOT_PATH . $this->_dir;
	}

	/**
	 * 静态工厂方法 返回日志对
	 *
	 * @param array $params
	 * module 日志记录的模块名，一般用于区分不同的功能模块
	 * type 日志存储类型：stream txt文本；db 数据库表
	 * dir 日志存储路径，默认为./application/../log/
	 * priority 日志记录策略，默认为7，一般不用设置
	 * @return Zend_log
	 */
	public static function factory($params = array())
	{
		$self = new self();
		//参数处理
		if(!is_null($params['module'])) $self->setModule($params['module']);
		if(!is_null($params['type'])) $self->setType($params['type']);
		if(!is_null($params['dir'])) $self->setDir($params['dir']);
		if(!is_null($params['priority'])) $self->setPriority($params['priority']);
		return $self->_factory();

	}

	/**
	 * 返回一个日志对象
	 */
	public function _factory()
	{
		$writer = $this->getWriter();
		$logger = new Zend_Log($writer);
		$filter = new Zend_Log_Filter_Priority($this->_priority);
		$logger->addFilter($filter);
		return $logger;
	}
	
	/**
	 * 日志分类名
	 * @param string $module
	 * @return Common_Logger
	 */
	public function setModule($module)
	{
		$this->_module = $module;
		return $this;
	}

	/**
	 * 设定输出日志类型
	 * @param string $type
	 * @return Common_Logger
	 */
	public function setType($type)
	{
		$this->_type = $type;
		return $this;
	}

	/**
	 * 设置日志文件所在路径
	 * @param string $dir 绝对路径，或正确的相对路径
	 * @return Common_Logger
	 */
	public function setDir($dir)
	{
		$this->_dir = $dir;
		return $this;
	}

	/**
	 * 设定日志等级
	 * @param int $priority
	 * @return Common_Logger
	 */
	public function setPriority($priority)
	{
		$this->_priority = intval($priority);
		return $this;
	}

	/**
	 * 获取Zend_Log_Writer实例
	 * @return Zend_Log_Writer_Abstract
	 */
	public function getWriter()
	{
		switch ($this->_type){
			case 'stream':
				$writer = new Zend_Log_Writer_Stream($this->getFile());
				break;
			case 'db':
				$writer = new Zend_Log_Writer_Db(Common_DB::getLogDB(), $this->getTable());
				break;
			case 'firebug':
				break;
			case 'mock':
				break;
		}
		return $writer;
	}

	/**
	 * 取得日志文件名
	 * @return string
	 */
	public function getFile()
	{
		return $this->_dir.$this->_module.'.txt';
	}

	/**
	 * 取得表名
	 * @return string
	 */
	public function getTable()
	{
		return $this->_module;
	}
}
